import winston from 'winston'
import path from 'path'
import util from 'util'
import fs from 'fs'

// 获取命令行参数
const args = process.argv.slice(2)
const params = {}
args
  .filter((arg) => arg !== '--') // 过滤掉 '--'
  .forEach((arg) => {
    const [key, value] = arg.split('=') // 使用 '=' 分隔
    if (key && value) {
      // 确保存在键和值
      params[key] = value
    }
  })
console.log('params:===log', params)

// 环境参数结构
const { botName = 'headless' } = params // 如果 botName 未提供，设置默认值

// 获取项目根目录
const projectRoot = path.resolve('./')

// 获取当前时间戳（北京时间：年月日时分秒格式）
const timestamp = new Date(
  Date.now() + 8 * 60 * 60 * 1000, // 转换为北京时间
)
  .toISOString()
  .replace(/T/, '-')
  .replace(/:/g, '-')
  .slice(0, 19)

// 确定日志文件夹路径
const botLogDir = path.join(projectRoot, 'logs', botName)

// 创建文件夹（如果不存在）
if (!fs.existsSync(botLogDir)) {
  fs.mkdirSync(botLogDir, { recursive: true })
}

// 配置日志文件路径
const logFileName = `${botName}-${timestamp}.log`
const logFilePath = path.join(botLogDir, logFileName)

// 格式化时间为北京时间，格式为 YYYY-MM-DD HH:mm:ss
const formatLocalTime = (timestamp) => {
  const date = new Date(timestamp)
  const localDate = new Date(date.getTime() + 8 * 60 * 60 * 1000)

  const year = localDate.getUTCFullYear()
  const month = String(localDate.getUTCMonth() + 1).padStart(2, '0')
  const day = String(localDate.getUTCDate()).padStart(2, '0')
  const hours = String(localDate.getUTCHours()).padStart(2, '0')
  const minutes = String(localDate.getUTCMinutes()).padStart(2, '0')
  const seconds = String(localDate.getUTCSeconds()).padStart(2, '0')

  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}

// 配置日志文件传输
const logTransport = new winston.transports.File({
  filename: logFilePath, // 日志文件路径
  maxsize: 40 * 1024 * 1024, // 文件大小 40MB
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.printf(({ timestamp, level, message }) => {
      // 使用格式化函数获取北京时间
      const localTimestamp = formatLocalTime(timestamp)

      return `${localTimestamp} [${level.toUpperCase()}]: ${
        typeof message === 'object' ? util.inspect(message, { depth: null, colors: false }) : message
      }`
    }),
  ),
  // 添加错误处理函数
  handleExceptions: true
})

// 创建 winston 日志记录器
const logger = winston.createLogger({
  level: 'info', // 最低日志级别
  transports: [logTransport],
  // 不在异常时退出
  exitOnError: false
})

// 保存原始 console 方法
const originalConsole = {
  log: console.log,
  info: console.info,
  warn: console.warn,
  error: console.error,
}

// 处理管道断开错误
process.on('uncaughtException', (error) => {
  if (error.code === 'EPIPE') {
    // 如果是管道断开错误，记录但不终止程序
    originalConsole.error('管道断开错误被捕获，但不会终止程序:', error.message)
  } else {
    // 其他未捕获的错误
    originalConsole.error('未捕获的异常:', error)
  }
})

// 自定义输出 console 方法，添加错误处理机制
;['log', 'info', 'warn', 'error'].forEach((method) => {
  console[method] = (...args) => {
    const formattedMessage = args
      .map((arg) => {
        if (arg instanceof Error) {
          return `${arg.message}\n${arg.stack}`
        }
        return typeof arg === 'object' ? util.inspect(arg, { depth: null, colors: false }) : String(arg)
      })
      .join(' ')

    try {
      // 写入日志文件，捕获可能的错误
      logger[method === 'log' ? 'info' : method](formattedMessage)
    } catch (error) {
      // 如果写日志出错，只在控制台记录错误，不影响程序运行
      originalConsole.error('日志写入失败:', error)
    }

    try {
      // 调用原始 console 方法，捕获可能的错误
      originalConsole[method](...args)
    } catch (error) {
      // 如果控制台输出出错，不影响程序运行
      if (error.code !== 'EPIPE') {
        originalConsole.error('控制台输出失败:', error)
      }
    }
  }
})

// 测试日志
console.log('This is a log message1')
console.info('This is an info message')
console.warn('This is a warning message')
console.error('This is an error message')
